home *** CD-ROM | disk | FTP | other *** search
/ PC-Blue - MS DOS Public Domain Library / PC-Blue MS-DOS Public Domain Library - NYACC.iso / vol309 / jdutil.arc / ASM.ARC / FIXPATH.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-07-05  |  7.1 KB  |  199 lines

  1.         TITLE   MSDOS2 PATHNAME PARSER
  2.  
  3. PATHSIZE EQU    65
  4.         .XLIST
  5.         INCLUDE MSDOS2.DEF
  6.         .LIST
  7.  
  8. CODE    SEGMENT BYTE PUBLIC 
  9.         ASSUME CS:CODE
  10.         EXTRN CPYCNT:NEAR
  11.         PUBLIC TYPE_UFN,TYPE_AFN,TYPE_DIR
  12.         PUBLIC TYPE_DSP,TYPE_DRV,TYPE_UNK
  13.         PUBLIC FIXPATH
  14.  
  15. ;       THIS PROCEDURE PARSES A (POSSIBLY AMBIGUOUS) DOS PATH NAME
  16. ;       INTO A SEARCH PATH AND A LEAD-IN PATH.  THE SEARCH PATH CAN
  17. ;       BE USED AS AN ARGUMENT TO DOS FUNCTIONS 4E AND 4F.  THE
  18. ;       LEAD-IN PATH IS INTENDED TO BE PREFIXED TO THE SIMPLE FILENAME
  19. ;       RETURNED BY THESE FUNCTIONS, IN ORDER TO PRODUCE A COMPLETE
  20. ;       PATH NAME USABLE BY OPEN, RENAME, ETC.
  21. ;
  22. ;       DS = ES IS ASSUMED.
  23. ;
  24. ;       MODELLED AFTER THE C FUNCTION fixpath() IN DR. DOBB'S JOURNAL,
  25. ;       OCT. 1985, PP. 16-18.
  26. ;
  27. ;       ENTRY: BX - POINTS TO INPUT PATH
  28. ;              CX - POINTS TO SEARCH PATH
  29. ;              DX - POINTS TO LEAD-IN PATH
  30. ;       EXIT:
  31. ;              AX = 0 IF PATH IS AN UNAMBIGUOUS FILE NAME
  32. ;                 = 1 IF PATH IS AN AMBIGUOUS FILE NAME (E.G. "FOO?.*")
  33. ;                 = 2 IF PATH IS A DIRECTORY SPEC (E.G.: A:\FOO\BAR\")
  34. ;                 = 3 IF PATH IS A DRIVE SPEC (E.G. "A:") OR NULL STRING
  35. ;                 = 4 IF PATH IS A DIRECTORY
  36. ;                 = 5 IF PATH TYPE UNKNOWN OR DOES NOT EXIST
  37. ;
  38. ;       USES:  SI,DI,FLAGS
  39. ;
  40. TYPE_UFN EQU    0
  41. TYPE_AFN EQU    1
  42. TYPE_DRV EQU    2
  43. TYPE_DSP EQU    3
  44. TYPE_DIR EQU    4
  45. TYPE_UNK EQU    5
  46.  
  47. COPYPATH MACRO
  48.         PUSH    CX
  49.         MOV     CX,PATHSIZE
  50.         CALL    CPYCNT
  51.         POP     CX
  52.         ENDM
  53.  
  54. COPYDATA MACRO
  55.         PUSH    DS
  56.         MOV     AX,CODE
  57.         MOV     DS,AX
  58.         COPYPATH
  59.         POP     DS
  60.         ENDM
  61.  
  62. SSTARS: DB      '\'
  63. STARS:  DB      '*.*',0
  64. SLASHALONE: DB  '\',0
  65.  
  66. FIXPATH PROC    NEAR
  67.         CMP     BYTE PTR [BX],0
  68.         JE      DRVSPEC                 ;IF NULL STRING
  69.         CMP     BYTE PTR [BX+1],':'     ;CHECK FOR DRIVE SPEC
  70.         JNE     NODSPEC                 ;IF NONE
  71.         CMP     BYTE PTR [BX+2],0       ;CHECK FOR ONLY DRIVE SPEC
  72.         JE      DRVSPEC                 ;IF THAT'S WHAT IT IS
  73. NODSPEC:
  74.         MOV     DI,BX
  75.         PUSH    CX
  76.         MOV     CX,80
  77.         MOV     AL,0
  78.         REPNE   SCASB                   ;FIND END OF STRING
  79.         POP     CX
  80.         DEC     DI
  81.         DEC     DI
  82.         MOV     AL,[DI]                 ;GET LAST CHAR.
  83.         CMP     AL,'.'                  ;IS IT DOT?
  84.         JE      DOT                     ;YES.
  85.         CMP     AL,'\'                  ;IS IT BACKSLASH?
  86.         JNE     FIXPATH2                ;NO.
  87.         MOV     AX,TYPE_DSP
  88.         JMP     SHORT DIRSPEC           ;YES, IT IS, ASSUME (*.*)
  89. DOT:    DEC     DI                      ;LAST CHAR. DOT
  90.         CMP     BYTE PTR [DI],'.'       ;IS PREV. CHAR. DOT, TOO?
  91.         JE      DOTDOT                  ;.., SEE IF IT EXISTS
  92.         MOV     BYTE PTR [DI+1],0       ;ONE DOT AT END OF PATH, ERASE IT
  93.         MOV     AX,TYPE_DSP
  94.         JMP     SHORT DIRSPEC           ;TREAT AS DIRECTORY SPEC
  95. DRVSPEC:
  96.         MOV     AX,TYPE_DRV
  97. DIRSPEC:
  98.         PUSH    AX                      ;SAVE PATH TYPE
  99.         MOV     SI,BX
  100.         MOV     DI,DX
  101.         COPYPATH                        ;COPY INPUT TO LEAD-IN PATH
  102.         MOV     SI,BX
  103.         MOV     DI,CX
  104.         COPYPATH                        ;COPY INPUT TO SEARCH PATH
  105.         DEC     DI                      ;BACK UP OVER NULL
  106.         MOV     SI,OFFSET CODE:STARS
  107.         COPYDATA                        ;NOW ADD "*.*" TO SEARCH PATH
  108.         POP     AX                      ;RETURN PATH TYPE
  109.         RET
  110. DOTDOT: INC     DI
  111. FIXPATH2:
  112.         PUSH    CX
  113.         PUSH    DX
  114.         MOV     DX,BX
  115.         MOV     CX,0
  116.         MOV     AH,CHMOD
  117.         MOV     AL,0
  118.         INT     DOS                     ;GET ATTRIBUTES FROM PATH
  119.         POP     DX
  120.         JC      BADNAME                 ;IF ERROR
  121.         TEST    CX,0010H                ;IS IT A DIRECTORY?
  122.         POP     CX
  123.         MOV     AX,TYPE_UFN             ;SIGNAL UFN, JUST IN CASE
  124.         JZ      FIXPATH3                ;IF NOT DIRECTORY, IS UFN
  125.         JMP     SHORT FIXPATH4          ;IF DIRECTORY
  126. BADNAME:
  127.         POP     CX
  128.         CMP     AX,3                    ;IF ERROR CODE 3,
  129.         JZ      TESTWILD                ;MIGHT BE VALID (BUT AMBIGUOUS) PATH NAME
  130.         MOV     AX,TYPE_UNK             ;SET TYPE =UNKNOWN
  131.         JMP     SHORT FIXPATH3          ;WEIRD ERROR CODE, TREAT PATH AS A UFN
  132. TESTWILD:                               ;CAN'T GET ATTRIBUTES, SEE IF
  133.         PUSH    BX                      ;PATH INCLUDES WILDCARDS
  134. WLOOP:  MOV     AL,[BX]
  135.         CMP     AL,0
  136.         JE      NOTWILD
  137.         CMP     AL,'*'
  138.         JE      WILD
  139.         CMP     AL,'?'
  140.         JE      WILD
  141.         INC     BX
  142.         JMP     WLOOP
  143. WILD:   POP     BX                      ;FOUND WILD CARD,
  144.         MOV     AX,TYPE_AFN             ;SET PATH TYPE = AFN
  145.         JMP     SHORT FIXPATH3
  146. NOTWILD:
  147.         POP     BX                      ;NO WILD CARD FOUND,
  148.         MOV     AX,TYPE_UNK             ;SET PATH TYPE UNKNOWN
  149. FIXPATH3:                               ;COME HERE IF PATH IS AFN, UFN OR UNKNOWN
  150.         PUSH    AX
  151.         PUSH    DX
  152.         PUSH    BX
  153.         MOV     SI,BX
  154.         MOV     DI,CX
  155.         PUSH    CX
  156.         COPYPATH                        ;MAKE SEARCH PATH=INPUT PATH
  157.         POP     DX                      ;DX = START OF PATH
  158.         MOV     BX,DI                   ;BX = END OF PATH (1 PAST NULL)
  159.         DEC     BX
  160. SRCLUP: CMP     BX,DX                   ;AT START OF PATH?
  161.         JLE     ENDSRC                  ;YUP.
  162.         MOV     AL,[BX]                 ;GET A CHAR. FROM PATH
  163.         CMP     AL,'\'                  ;IS IT BACKSLASH OR COLON?
  164.         JE      RETAIN
  165.         CMP     AL,':'
  166.         JE      RETAIN
  167.         DEC     BX                      ;NO, BACK UP 1
  168.         JMP     SRCLUP                  ;KEEP SEARCHING
  169. RETAIN: INC     BX
  170. ENDSRC: MOV     [BX],BYTE PTR 0         ;ZAP WHATEVER IS AFTER ':' OR '\'
  171.         POP     BX
  172.         POP     DX
  173.         MOV     SI,CX
  174.         MOV     DI,DX
  175.         COPYPATH                        ;COPY SEARCH PATH TO LEAD-IN PATH
  176.         MOV     SI,BX
  177.         MOV     DI,CX
  178.         COPYPATH                        ;WHOLE INPUT FOR SEARCH
  179.         POP     AX                      ;RESTORE TYPE
  180.         RET
  181. FIXPATH4:                               ;COME HERE IF PATH IS A DIRECTORY
  182.         MOV     SI,BX
  183.         MOV     DI,CX
  184.         COPYPATH                        ;COPY INPUT TO SEARCH PATH
  185.         DEC     DI                      ;BACK UP OVER NULL
  186.         MOV     SI,OFFSET CODE:SSTARS   ;POINT TO "\*.*"
  187.         COPYDATA                        ;ADD TO SEARCH PATH
  188.         MOV     SI,BX
  189.         MOV     DI,DX
  190.         COPYPATH                        ;COPY INPUT TO LEAD-IN PATH
  191.         DEC     DI                      ;BACK UP OVER NULL
  192.         MOV     SI,OFFSET CODE:SLASHALONE    ;POINT TO "\"
  193.         COPYDATA                        ;ADD TO LEAD-IN PATH
  194.         MOV     AX,TYPE_DIR             ;SIGNAL DIRECTORY
  195.         RET
  196. FIXPATH ENDP
  197. CODE    ENDS
  198.         END
  199.